/* -------------------------------------------------------------------------
 *
 * ts_cache.h
 *	  Tsearch related object caches.
 *
 * Portions Copyright (c) 1996-2012, PostgreSQL Global Development Group
 * Portions Copyright (c) 1994, Regents of the University of California
 *
 * src/include/tsearch/ts_cache.h
 *
 * -------------------------------------------------------------------------
 */
#ifndef TS_CACHE_H
#define TS_CACHE_H

#include "tsearch/ts_public.h"
#include "utils/guc.h"

/*
 * All TS*CacheEntry structs must share this common header
 * (see InvalidateTSCacheCallBack)
 */
typedef struct TSAnyCacheEntry {
    Oid objId;
    bool isvalid;
} TSAnyCacheEntry;

typedef struct TSParserCacheEntry {
    /* prsId is the hash lookup key and MUST BE FIRST */
    Oid prsId; /* OID of the parser */
    bool isvalid;

    Oid startOid;
    Oid tokenOid;
    Oid endOid;
    Oid headlineOid;
    Oid lextypeOid;

    /*
     * Pre-set-up fmgr call of most needed parser's methods
     */
    FmgrInfo prsstart;
    FmgrInfo prstoken;
    FmgrInfo prsend;
    FmgrInfo prsheadline;
} TSParserCacheEntry;

typedef struct TSDictionaryCacheEntry {
    /* dictId is the hash lookup key and MUST BE FIRST */
    Oid dictId;
    bool isvalid;

    /* most frequent fmgr call */
    Oid lexizeOid;
    FmgrInfo lexize;

    MemoryContext dictCtx; /* memory context to store private data */
    void* dictData;
} TSDictionaryCacheEntry;

typedef struct ListDictionary {
    int len;
    Oid* dictIds;
} ListDictionary;

typedef struct TSConfigCacheEntry {
    /* cfgId is the hash lookup key and MUST BE FIRST */
    Oid cfgId;
    bool isvalid;
    Oid prsId;
    int lenmap;
    ListDictionary* map;
    ParserCfOpts* opts; /* add configuration options */
} TSConfigCacheEntry;

extern TSParserCacheEntry* lookup_ts_parser_cache(Oid prsId);
extern TSDictionaryCacheEntry* lookup_ts_dictionary_cache(Oid dictId);
extern TSConfigCacheEntry* lookup_ts_config_cache(Oid cfgId);

extern Oid getTSCurrentConfig(bool emitError);
extern bool check_TSCurrentConfig(char** newval, void** extra, GucSource source);
extern void assign_TSCurrentConfig(const char* newval, void* extra);

#endif /* TS_CACHE_H */
